package study.core.rdd.operator

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * 转换算子之coalesce操作
 * 根据数据量缩减分区，用于大数据集过滤后，提高小数据集的执行效率
 * 当 spark 程序中，存在过多的小任务的时候，可以通过 coalesce 方法，收缩合并分区，减少
 * 分区的个数，减小任务调度成本
 *
 * @author zh
 * @date 2021/5/15 10:47
 */
object TestCoalesce {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("rddMap")
    val context = new SparkContext(sparkConf)

    // 准备集合
    val list = List(1, 2, 3, 4, 5, 6)
    // 创建RDD
    val rdd: RDD[Int] = context.makeRDD(list, 3)

    // 将原本的三个分区缩减为2个分区，但是默认情况下并不会将分区的数据重新打乱，可能会造成数据倾斜，造成的结果为
    // 第一个分区  1 2
    // 第二个分区  3 4 5 6
    // 此时，可以使用第二个参数shuffle，默认为false，传入true，此时就会将数据重新打乱进行分配
    // 第一个分区  1 4 5
    // 第二个分区  2 3 6
//    val result = spark.core.rdd.coalesce(2)
    val result = rdd.coalesce(2,true)
    rdd.repartition(2)
   result.saveAsTextFile("output")

    context.stop()



  }

}
